package io.github.cchenxi.crpc.core.utils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * {@link Method} 工具类
 * Date: 2024-03-13
 *
 * @author chenxi
 */
public final class MethodUtil {
    /**
     * 构造方法签名
     *
     * @param method 方法
     * @return 方法签名
     */
    public static String methodSign(Method method) {
        StringBuilder sb = new StringBuilder();
        sb.append(method.getName());
        sb.append('@').append(method.getParameterCount());
        Arrays.stream(method.getParameterTypes()).forEach(type -> sb.append('_').append(type.getCanonicalName()));
        return sb.toString();
    }

    /**
     * 查找字段
     *
     * @param clazz           类
     * @param annotationClazz 注解
     * @return 字段列表
     */
    public static List<Field> findAnnotatedField(Class<?> clazz, Class<? extends Annotation> annotationClazz) {
        List<Field> result = new ArrayList<>();
        while (clazz != null) {
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(annotationClazz)) {
                    result.add(field);
                }
            }
            clazz = clazz.getSuperclass();
        }
        return result;
    }

    /**
     * 判断方法是否是 {@link Object} 的方法
     * @param method 方法
     * @return 是否 {@link Object} 的方法
     */
    public static boolean checkLocalMethod(Method method) {
        return method.getDeclaringClass().equals(Object.class);
    }
}
